#include <ESP8266WiFi.h>
#include <TJpg_Decoder.h>
#include "SPI.h"
#include <TFT_eSPI.h>              // Hardware-specific library
#include <String.h>
#include <WiFiUdp.h>
#include "test.h"

#define AP_SSID "小伤口"             //所用WiFi的名字
#define AP_PSW  "123456789"       //所用WiFi的密码

TFT_eSPI tft = TFT_eSPI();         // Invoke custom library

WiFiUDP Udp;//实例化WiFiUDP对象
unsigned int localUdpPort = 8888;  // 自定义本地监听端口

boolean showTime=true;

uint8_t imageBuff[8000]= {0};



// This next function will be called during decoding of the jpeg file to
// render each block to the TFT.  If you use a different TFT library
// you will need to adapt this function to suit.
bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap)
{
   // 停止进一步解码，因为图像正在从屏幕底部运行
  if ( y >= tft.height() ) return 0;

  // 此功能将在 TFT 边界处自动裁剪图像块渲染
  tft.pushImage(x, y, w, h, bitmap);

  // This might work instead if you adapt the sketch to use the Adafruit_GFX library
  // tft.drawRGBBitmap(x, y, bitmap, w, h);

  // Return 1 to decode next block
  return 1;
}

uint8_t len2 = sizeof(imageSum) / sizeof(int),i;


void setup()
{

  //////////////////////////串口//////////////////////////
  Serial.begin(115200);


  //////////////////////////TFT//////////////////////////
  // 初始化 TFT
  tft.begin();  
  tft.fillScreen(TFT_BLACK);
  
  // jpeg 图像可以按 1、2、4 或 8 的系数缩放
  TJpgDec.setJpgScale(1);

  // 可以交换字节顺序（TFT_eSPI设置为 true）
  TJpgDec.setSwapBytes(true);

  // 解码器必须具有上述渲染函数的确切名称
  TJpgDec.setCallback(tft_output);


  //////////////////////////WIFI//////////////////////////
  WiFi.mode(WIFI_STA);              //设置WiFi 为 Station 模式
  WiFi.begin(AP_SSID,AP_PSW);       //连接WiF 
  Serial.println("正在连接 WiFi... ");
  //等待wifi连接成功
  while (WiFi.status() != WL_CONNECTED) {
    tftText("loading...");
  } 
  tft.fillScreen(TFT_BLACK);
  Serial.println("");
  Serial.println("连接成功");
  Serial.println("本地 IP: ");
  Serial.println(WiFi.localIP());

  //////////////////////////UDP//////////////////////////
  if(Udp.begin(localUdpPort)){//启动Udp监听服务
    Serial.println("监听成功");
    //打印本地的ip地址，在UDP工具中会使用到
    //WiFi.localIP().toString().c_str()用于将获取的本地IP地址转化为字符串   
    Serial.printf("现在收听IP：%s, UDP端口：%d\n", WiFi.localIP().toString().c_str(), localUdpPort);
  }else{
    Serial.println("监听失败");
  }

  
}

/*
显示动画和文字
*/
void tftText(String text){
  tft.setRotation(1);
  if(i>=len2){
    i=0;
  }
 
  uint16_t w = 0, h = 0;
  
  TJpgDec.getJpgSize(&w, &h, *(imageSum+i), 8000);
  Serial.print("Width = "); Serial.print(w); Serial.print(", height = "); Serial.println(h);
  TJpgDec.drawJpg((160-w)/2,(100-h)/2 ,*(imageSum+i) , 8000);
  delay(50);
  i++;
  
  tft.setCursor(40, 80, 1);             //设置起始坐标(10, 10)，2 号字体
  tft.setTextColor(TFT_YELLOW);         //设置文本颜色为黄色
  tft.setTextSize(1);                   //设置文字的大小 (1~7)
  tft.println(text);              //显示文字
  
}

//图片绘制函数
void tftDrawImage(int len){
  
  tft.setRotation(0);
  //屏幕填充为红色
//  tft.fillScreen(TFT_RED);

  // jpeg的宽度和高度（以像素为单位）
  uint16_t w = 0, h = 0;
  
  //获取jped的宽度和高度
  TJpgDec.getJpgSize(&w, &h, imageBuff, len);

  //打印宽度和高度信息
  Serial.print("Width = "); Serial.print(w); Serial.print(", height = "); Serial.println(h);

  // 绘制图片, top left at 0,0
  TJpgDec.drawJpg((130-w)/2,(160-h)/2 , imageBuff, len);

}

void loop()
{
  int packetSize = Udp.parsePacket();
  if(packetSize){//判断是否有UDP数据包
    
        int len = Udp.read(imageBuff, 8000);
        //TFT绘制图片
        tftDrawImage(len);
        memset(imageBuff, 0, len); //清空数组
        showTime=false;
  }
  else{
    if(showTime){
      tftText(WiFi.localIP().toString().c_str());      
    }
  }

 
        
    //    打印存储图片的数组
    //    for(int i=0; i<40000; i++){      
    //      Serial.print(img_buff[i],HEX); 
    //    }
    //    Serial.println();

 
  
  
}
